package com.example.hiltapplication.ui

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.SeekBar
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.example.hiltapplication.R
import com.example.hiltapplication.databinding.ActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    val TAG = "MainActivity"



    private lateinit var mainLayoutProfile:ActivityMainBinding

    //线程不安全，在协程中可能导致创建多个mainViewModel实例
    val mainViewModel: MainViewModel by viewModels<MainViewModel>()

    //    @Inject lateinit var mainViewModel: MainViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.skyWinOpenBtn.setOnClickListener {
//            lifecycleScope.launch(Dispatchers.Main) {//UI线程开启一个协程
//                withContext(Dispatchers.IO) {//切换到IO 线程
//                    mainViewModel.fullOpenSkyWindow()
//                }
//                //切回UI 线程
//            }
            /**
             * 调用 mainViewModel.fullOpenSkyWindow()方法
             * 这里是在Main线程开启一个协程，作用于在lifecycleScope
             * 这里采用lifecycleScope 作为作用域不适合，可能有的业务在界面销毁后也要继续执行
             * 所以这里建议采用viewModelScope
             * */
            mainViewModel.skyWinClicked()

        }

        binding.skyWinPosSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {

            }

            override fun onStartTrackingTouch(p0: SeekBar?) {

            }

            override fun onStopTrackingTouch(p0: SeekBar?) {
                p0?.let {
                    //抬手下发
                    mainViewModel.setSkyWindowPos(p0.progress)
                }

            }

        })

//        mainViewModel
        /**
         * 作用于为  lifecycleScope 在线程Main上开启协程，次协程的作用域在视图的生命周期内
         * 当视图销毁时，有lifecycleScope创建的协程同时被销毁 避免视图不可见时相关操作浪费资源
         * 协程uiStateCollectJob 会被内部的collect给挂起等待数据的到来，
         * 当收到 skyUiStateFlow的数据变化时，uiStateCollectJob将尝试获取UI线程的使用权
         * 去更新view
         * */
        val uiStateCollectJob = lifecycleScope.launch(Dispatchers.Main) {
            mainViewModel.pageUiState.collect { pageUiState ->//执行collect方法，在当前协程让出线程，并挂起等待
//                withContext(Dispatchers.Main){//收到数据流，重新占有UI线程 操作更新UI显示
                val skyUiState = pageUiState.skyUiState

                Log.i(TAG, "onCreate: $skyUiState")
                binding.skyWinOpenBtn.isEnabled = skyUiState.openEnable
                binding.skyWinOpenBtn.text = this@MainActivity.resources.getText(skyUiState.skyWindTextRes)
                binding.skyWinPosSeekbar.progress = skyUiState.posValue
                binding.skyWinPos.text = "天窗开度值${skyUiState.posValue}%"
                val tailGateUiState = pageUiState.tailgateUiState
                // TODO: 更新其他控件
                binding.tailGateOpenBtn.isEnabled = tailGateUiState.openBtnEnable
                binding.tailGateCloseBtn.isEnabled = tailGateUiState.closeBtnEnable
                binding.tailGatePosSeekbar.progress = tailGateUiState.tailGatePos
                binding.tailGatePos.text = "尾门开度值${tailGateUiState.tailGatePos}%"
            }
        }
        binding.tailGateOpenBtn.setOnClickListener {
            mainViewModel.openTailGate()
        }
        binding.tailGateCloseBtn.setOnClickListener {
            mainViewModel.closeTailGate()
        }
        binding.tailGatePosSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
            }
            override fun onStartTrackingTouch(p0: SeekBar?) {
            }
            override fun onStopTrackingTouch(p0: SeekBar?) {
                p0?.let {
                    mainViewModel.setTailGatePos(it.progress)
                }
            }
        })
        /**
         * 使用作用域lifecycleScope 在IO线程池开启一个协程
         * 监听 otherWindUiStateFlow的变化
         * 内部的collect 挂起当前协程 等待数据到来
         * 收到数据后 在IO线程执行 并通过 withContext(Dispatchers.Main)
         * 同步的切换到UI线程执行代码块内部的部分
         * 同步返回结果后，继续切换回IO线程执行完后面的协程代码
         * 再次进入到 挂起状态
         * */
        /*val ioThreadCollectJob= lifecycleScope.launch(Dispatchers.IO) {//执行collect方法，在当前协程让出当前IO线程，并挂起等待
            mainViewModel.pageUiState.collect { pageUiState ->//执行collect方法，在当前协程让出线程，并挂起等待
                withContext(Dispatchers.Main){//收到数据流，重新占有UI线程 操作更新UI显示
                    val skyUiState = pageUiState.skyUiState

                    Log.i(TAG, "onCreate: $skyUiState")
                    openBtn.isEnabled = skyUiState.openEnable
                    closeBtn.isEnabled = skyUiState.closeEnable
                    openBtn.text = this@MainActivity.resources.getText(skyUiState.openTextResId)
                    closeBtn.text = this@MainActivity.resources.getText(skyUiState.closeTextResId)

                    val otherWinUiState = pageUiState.otherWinUiState
                    // TODO: 更新其他控件
                }
            }
        }*/
    }
}